// @Author EthanScriptOn
// @Desc
package srf_switch_dynamic_logic_director

import (
	"fmt"
	"gitee.com/fatzeng/srf_switch_dynamic_logic_director/common"
	"gitee.com/fatzeng/srf_switch_dynamic_logic_director/config"
	"gitee.com/fatzeng/srf_switch_dynamic_logic_director/router"
	"github.com/gin-gonic/gin"
	"github.com/go-xorm/xorm"
	"strings"
)

func DirectorStart() (err error) {
	err = configInitial()
	if err != nil {
		return err
	}
	err = webStart()
	if err != nil {
		return err
	}
	return
}

func configInitial() (err error) {
	if !config.SrfSwitchEventPublisherFunction.IsIntialized() {
		if instance, err := config.SrfSwitchEventPublisherFunction.Get(); err != nil {
			return err
		} else {
			if _, ok := instance.(config.PublishFunction); !ok {
				return fmt.Errorf("the obtained is not of PublishFunction")
			}
		}
	}
	if !config.MysqlEngine.IsIntialized() {
		if instance, err := config.MysqlEngine.Get(); err != nil {
			return err
		} else {
			if _, ok := instance.(*xorm.Engine); !ok {
				return fmt.Errorf("the obtained is not of *xorm.Engine")
			}
		}
	}
	return
}

func webStart() (err error) {
	engine := gin.Default()
	router.RegisterRouter(engine)
	portConfig := common.SrfDirectorGlobalConfig.SrfSystemConfig.SrfDirectorPort
	if !strings.HasPrefix(portConfig, ":") {
		portConfig += ":"
	}
	err = engine.Run(portConfig)
	if err != nil {
		return err
	}
	return
}
